#ifndef __SSD1306_C
#define __SSD1306_C

#include "SSD1306.h"


//OLED 使能引脚初始化
void oled_reset_Pin_init(){
   GPIO_Config_T gpioConfigStruct;	
	 RCM_EnableAPB2PeriphClock(OLed_Reset_PIN_RTC);
	 gpioConfigStruct.mode  = GPIO_MODE_OUT_PP;
   gpioConfigStruct.speed = GPIO_SPEED_50MHz;	
   gpioConfigStruct.pin   = OLed_Reset_PinId;	
   GPIO_Config(OLed_Reset_PinPort, &gpioConfigStruct);  
}
 
#ifndef UsingFreeRTOS
// 初始化设置					    
void ssd1306_init(void){
    I2C_TX_DMA_Init();
	  IIC_init();		
	  OLed_Reset_PinPort -> BC =  OLed_Reset_PinId;	  
	  // 等待，拉高
	  oled_reset_step_tm = system_time & 0x000000000000ffff; //system_time % 65536;
	  oled_reset_step_delay = 50; //50ms	
	  oled_reset_step = 1;
	  printf(" ssd1306_init  =  %d  \r\n", oled_reset_step_tm);
} 


// Oled重置操作步
void oled_reset_step_run(){
	  printf(" oled_reset_step_run  =  %d  \r\n", oled_reset_step);
//	  if(oled_reset_step == 1){
//			  // OLED 拉高正常工作
//			  OLed_Reset_PinPort -> BSC =  OLed_Reset_PinId;
//			  oled_register_config();
//			  // 结束初始化步
//			  oled_reset_step = 2;
//			  oled_reset_step_tm = system_time & 0x000000000000ffff;
//	      oled_reset_step_delay = 150;
//		} else if(oled_reset_step == 2){
//			  if(OledResetTm == 2){
//					  getShowData();
//				}				
//				oled_reset_step = 3;
//			  oled_reset_step_tm = 0;
//	      oled_reset_step_delay = 0;
//		}
		if(oled_reset_step == 1){			  
			  // OLED 拉高正常工作
			  OLed_Reset_PinPort -> BSC =  OLed_Reset_PinId;
			  // 结束初始化步
			  oled_reset_step = 2;
			  oled_reset_step_tm = system_time & 0x000000000000ffff;
	      oled_reset_step_delay = 5;
		} else if(oled_reset_step == 2){			  	
			  oled_register_config();		
				oled_reset_step = 3;
			  oled_reset_step_tm = system_time & 0x000000000000ffff;
	      oled_reset_step_delay = 100;
		} else if(oled_reset_step == 3){
			  getShowData();			
				oled_reset_step = 4;
			  oled_reset_step_tm = 0;
	      oled_reset_step_delay = 0;			   
		}
}
#endif

void oled_register_config(){
    i2c_wr_byte(0xAE, OLED_CMD); //--进入睡眠状态;关闭OLED
	  
	  i2c_wr_byte(0xd5, OLED_CMD); //--设置显示时钟分频数 set display clock divide ratio/oscillator frequency		
    i2c_wr_byte(0xF0, OLED_CMD); //--设置分频数 set divide ratio, Set Clock as 100 Frames/Sec; 0x80
	
	  i2c_wr_byte(0xA8, OLED_CMD); //--设置MUX数 (显示行数); 设置多路复用比 set multiplex ratio(1 to 64)
	  i2c_wr_byte(0x27, OLED_CMD); //--1/40 duty; OLED_HEIGH - 1 = 39 = 0x27; 若是全部行，则 0x40 = 63 
	
	  i2c_wr_byte(0xD3, OLED_CMD); //--设置垂直显示偏移(向上) set display offset Shift Mapping RAM Counter (0x00~0x3F)
	  i2c_wr_byte(0x00, OLED_CMD); //--not offset; 光标偏移 = 0; 即：内存的第0行，对应屏幕显示的0行; 0 偏移。
	
	  i2c_wr_byte(0x40, OLED_CMD); //--设置显示的起始行;  Set Mapping RAM Display Start Line (0x00~0x3F); 起始 = 64行;
	  
	  // 硬件电源打开，设置电荷泵
    i2c_wr_byte(0x8D, OLED_CMD); //--电荷泵使能set Charge Pump enable/disable
    i2c_wr_byte(0x95, OLED_CMD); //--set(0x10) disable;  0x14；Vcc = 7.5V; 
	
	  i2c_wr_byte(0x20, OLED_CMD); //-- 设置GDDRAM模式：Set Page Addressing Mode (0x00/0x01/0x02) 设置地址模式
    i2c_wr_byte(0x00, OLED_CMD); //00b, Horizontal Addressing Mode水平地址模式。10b = 二进制10 = 0x02。
	
	  i2c_wr_byte(0xA1, OLED_CMD); //i2c_wr_byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
		
    i2c_wr_byte(0xC8, OLED_CMD); //i2c_wr_byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
	  
	  i2c_wr_byte(0xDA, OLED_CMD); //--set com pins hardware configuration
    i2c_wr_byte(0x12, OLED_CMD); // 若显示有间隔条纹，则在：0x02 / 0x12 / 0x22 / 0x32中选一个试试。
	  
	  i2c_wr_byte(0xAD, OLED_CMD); //--设置对比度 = 亮度
	  i2c_wr_byte(0x30, OLED_CMD); //--设置对比度值: 7F = 127;
		
		i2c_wr_byte(0x81, OLED_CMD); //--设置对比度 = 亮度
	  i2c_wr_byte(0xAF, OLED_CMD); //--设置对比度值: 7F = 127;
		
		i2c_wr_byte(0xD9, OLED_CMD); //--set pre-charge period
    i2c_wr_byte(0x1F, OLED_CMD); //Set Pre-Charge as 15 Clocks & Discharge as 1 Clock;0xF1
		
		i2c_wr_byte(0xDB, OLED_CMD); //--set vcomh
    i2c_wr_byte(0x20, OLED_CMD); //Set VCOM Deselect Level;0x40
		
		// 关闭满屏显示：
    i2c_wr_byte(0xA4, OLED_CMD); // Disable Entire Display On (0xa4/0xa5)
		
		i2c_wr_byte(0xA6, OLED_CMD); //--正常显示(1亮0灭)
		
		i2c_wr_byte(0x0C, OLED_CMD); //--
    i2c_wr_byte(0x11, OLED_CMD); //--
		
//	  i2c_wr_byte(0x20, OLED_CMD); //-- 设置GDDRAM模式：Set Page Addressing Mode (0x00/0x01/0x02) 设置地址模式
//    i2c_wr_byte(0x00, OLED_CMD); //00b, Horizontal Addressing Mode水平地址模式。10b = 二进制10 = 0x02。
	
//	  // 设置光标初始位置，即当前显示位置：0,0    
//	  i2c_wr_byte(0xB0, OLED_CMD); //--指定光标的页地址; B0 = 第1页
//	  i2c_wr_byte(0x00, OLED_CMD); //--指定光标的列地址; 列低4位 = 0x0x;
//    i2c_wr_byte(0x10, OLED_CMD); //--指定光标的列地址; 列高4位 = 0x1y; 列 = yx。
			
		// 软件开机		
    i2c_wr_byte(0xAF, OLED_CMD); // 开启显示 = display ON		
				
}


// 设置显示字符位置的函数：x单位 = 列id；y单位 = 页，8行；
// 设置显示光标：
void OLed_SetPos(uint8_t x, uint8_t y){
	 i2c_wr_byte((0xb0 + y), OLED_CMD);  //页的首地址 + y偏移单位
	 i2c_wr_byte(((x & 0xf0) >> 4) | 0x10, OLED_CMD);  //列地址高位 
	 i2c_wr_byte((x & 0x0f) | 0x00, OLED_CMD);   //列地址低位	
}

uint8_t get_str_index(u8 chr){
	  if(chr >= '0' && chr <= '9'){
			  return (chr - '0');
		}else if(chr == 'A'){
			  return 10;
		}else if(chr == 'K'){
			  return 11;
		}else if(chr == 'W'){
			  return 12;
		}else if(chr == 'h'){
			  return 13;
		}else if(chr == ':'){
			  return 14;
		}else if(chr == '.'){
			  return 15;
		}else if(chr == ' '){
			  return 16;
		}
	  return chr - ' ';
}

// 刷新屏幕的函数：100ms执行一次
void refreshOled(void){
	  OLed_SetPos(0,0);
	  i2c_write_buffer(oledAllDotShow,OLED_RAM_SIZE);
}

void insertOneString(uint8_t x,uint8_t y,char *str,uint8_t strLen){
	  uint16_t i = 0; 
	  uint16_t j = 0;
	  uint8_t charId = 0;
		for(j = 0; j < strLen; j++){			  
			  charId = get_str_index(str[j]);   
			  for(i = 0; i < 8; i++){            					
					  oledAllDotShow[y * 128 + i + x + j * 8] = F8X16[charId][i];
					  oledAllDotShow[(y + 1) * 128 + i + x + j * 8] = F8X16[charId][i+8];
				}
		}	  
}

void insertOneString2(uint8_t x,uint8_t y,char *str,uint8_t strLen){
	  uint16_t i = 0; 
	  uint16_t j = 0;
	  uint8_t charId = 0;
		for(j = 0; j < strLen; j++){			  
			  charId = get_str_index(str[j]);  
			  for(i = 0; i < 12; i++){            					
					  oledAllDotShow[y * 128 + i + x + j * 12] = F12X24[charId][i];
					  oledAllDotShow[(y + 1) * 128 + i + x + j * 12] = F12X24[charId][i+12];
					  oledAllDotShow[(y + 2) * 128 + i + x + j * 12] = F12X24[charId][i+24];
				}
		}	  
}



#endif


